/**
 * 给定数组A和B，再给定一些禁止选择的对，禁选的数量最多到1E5
 * 要求从A和B中各选一个元素使得和最大
 * 如果没有禁选的，显然选择A、B最大的即可
 * 现在存在禁选，按从大到小依次查看即可，最多查到1E5+1，肯定有结果，这里有另外一个做法
 * 将B从大到小排序
 * ans = 0
 * 遍历Ai:
 *     遍历Bj:
 *         第一个没有被禁止的(i, j)一定是Ai能够获得的最大和
 *         ans = max(ans, Ai + Bj)
 *         break
 * 如果没有禁止，则实际上只做了O(N)的循环，现在有禁止项，因此需要多循环L次。
 * 因此整个循环是O(N+L)，而非O(NM)
 * 禁选项用有序集合81ms，用哈希表1000ms
 */
#include <bits/stdc++.h>
using namespace std;

#include <bits/extc++.h>

using Real = long double;
using llt = long long;
using vi = vector<int>;
using pii = pair<int, int>;

struct pair_hash{
    template<typename T1, typename T2>
    std::size_t operator () (const pair<T1, T2> & p) const {
        return (size_t)p.first * 1333331 + p.second;
    }
};

int L;
int N, M;
vector<pii> A, B;
// __gnu_pbds::gp_hash_table<pii, int, pair_hash> Set;
map<pii, int> Set;

int proc(){
    sort(B.begin(), B.end(), greater<pii>());

    int ans = 0;
    for(const auto & p : A){
        for(const auto & t : B){
            if(Set.find({p.second, t.second}) != Set.end()) continue;

            ans = max(ans, p.first + t.first);
            break;
        }
    }
    return ans;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int nofakse = 1;
    // cin >> nofakse;
    while(nofakse--){
        cin >> N >> M >> L;
        A.assign(N, {});
        for(int i=0;i<N;++i)cin >> A[i].first, A[i].second = i + 1;
        B.assign(M, {});
        for(int i=0;i<M;++i) cin >> B[i].first, B[i].second = i + 1;
        for(int a,b,i=0;i<L;++i){
            cin >> a >> b;
            Set.insert({{a, b}, 0});
        }
        cout << proc() << endl;
    }
    return 0;
}